/*
 * Projeto idealizado para ensino interativo com uso de recursos Flash e Java
 * O uso destes codigos eh de extrema restricao, valendo dos direitos dos seus
 * desenvolvedores
 *
 * @author Fabricio Silva
 */

package br.com.dimensaointerativo.negocioDAO;

import br.com.dimensaointerativo.dao.DAO;
import br.com.dimensaointerativo.dao.DAOException;
import br.com.dimensaointerativo.dto.AlunoDTO;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.LinkedList;

/**
 *
 * Todos recursos associados a manipulacao de dados de acordo a secao de alunos
 * @author Fabricio Silva
 */
public class AlunoDAO {
    
    private DAO dao;

    public AlunoDAO() {
	dao = new DAO();
    }

    /**
     * Responsavel por tratar de insercao de informacoes de alunos na base de dados
     * @author Fabricio Silva
     */
    public void insert (AlunoDTO alunoDTO) throws DAOException {
        // Captando uma conexao com a base de dados
        Connection conexao = dao.getConnection();

        // Passar valores em instrucoes SQL
        PreparedStatement ps = null;

        // Contera a instrucao SQL
        StringBuilder sql = new StringBuilder();
        try {
            // limpando o conteudo do objeto sql
            sql.delete(0, sql.length());

            // Montando a estrutura da instrucao
            sql.append("INSERT INTO dados_aluno (endereco, telefone, idade, sexo, id_login) ");
            sql.append("VALUES (?, ?, ?, ?, ?)");

            // Captando os valores passados pelo usuario no formulario
            ps = conexao.prepareStatement(sql.toString());
            ps.setString(1, alunoDTO.getEndereco());
            ps.setString(2, alunoDTO.getTelefone());
            ps.setInt(3, alunoDTO.getIdade());
            ps.setString(4, alunoDTO.getSexo());
            ps.setInt(5, insertLogin(alunoDTO));

            // Executando a instrucao e agendando sua persistencia
            ps.execute();

            // Persistindo a informacao na base 
            // conexao.commit();
        } catch(Exception e1) {

            // Tratando excecao lancando mensagem na tela (console)
            e1.printStackTrace();
            throw new DAOException(e1.getMessage());
        } finally {
                try {

                    // Limpando a conexao, fechando a conexao
                    conexao.close();
                } catch (SQLException e2) {

                    // Tratando excecao lancando mensagem na tela (console)
                    throw new DAOException(e2.getMessage());
                }
        }
    }

    /**
     * Atualizara informacoes contidas na tabela login, que por ventura
     * ira executar tambem atualizacoes na tabela dados_aluno
     * @param alunoDTO
     * @throws DAOException
     */
    public void update(AlunoDTO alunoDTO) throws DAOException {
        // Captando uma conexao com a base de dados
        Connection conexao = dao.getConnection();

        // Passar valores em instrucoes SQL
        PreparedStatement ps = null;

        // Contera a instrucao SQL
        StringBuilder sql = new StringBuilder();
        try {
            // limpando o conteudo do objeto sql
            sql.delete(0, sql.length());

            // Montando a estrutura da instrucao
            sql.append("UPDATE login ");
            sql.append("SET usuario = ?, ");
            sql.append("senha = ? ");
            sql.append("WHERE id_login = ? ");

            // Captando os valores passados pelo usuario no formulario
            ps = conexao.prepareStatement(sql.toString());
            ps.setString(1, alunoDTO.getNome());
            ps.setString(2, alunoDTO.getSenha());
            ps.setInt(3, alunoDTO.getIdLogin());
            
            // Executando a instrucao e agendando sua persistencia
            ps.execute();

            // Atualizando informacoes de dados_aluno
            updateDadosAluno(alunoDTO);

            // Persistindo a informacao na base
            // conexao.commit();
        } catch(Exception e1) {

            // Tratando excecao lancando mensagem na tela (console)
            e1.printStackTrace();
            throw new DAOException(e1.getMessage());
        } finally {
                try {

                    // Limpando a conexao, fechando a conexao
                    conexao.close();
                } catch (SQLException e2) {

                    // Tratando excecao lancando mensagem na tela (console)
                    throw new DAOException(e2.getMessage());
                }
        }
    }

    /**
     * Alterara informacoes associadas a tabela dados_aluno
     */
    public void updateDadosAluno(AlunoDTO alunoDTO) throws DAOException {
        // Captando uma conexao com a base de dados
        Connection conexao = dao.getConnection();

        // Passar valores em instrucoes SQL
        PreparedStatement ps = null;

        // Contera a instrucao SQL
        StringBuilder sql = new StringBuilder();
        try {
            // limpando o conteudo do objeto sql
            sql.delete(0, sql.length());

            // Montando a estrutura da instrucao
            sql.append("UPDATE dados_aluno ");
            sql.append("SET endereco = ?, ");
            sql.append("telefone = ?, ");
            sql.append("idade = ?, ");
            sql.append("sexo = ? ");
            sql.append("WHERE id_login = ? ");

            // Captando os valores passados pelo usuario no formulario
            ps = conexao.prepareStatement(sql.toString());
            ps.setString(1, alunoDTO.getEndereco());
            ps.setString(2, alunoDTO.getTelefone());
            ps.setInt(3, alunoDTO.getIdade());
            ps.setString(4, alunoDTO.getSexo());
            ps.setInt(5, alunoDTO.getIdLogin());

            // Executando a instrucao e agendando sua persistencia
            ps.execute();

            // Persistindo a informacao na base
            // conexao.commit();
        } catch(Exception e1) {

            // Tratando excecao lancando mensagem na tela (console)
            e1.printStackTrace();
            throw new DAOException(e1.getMessage());
        } finally {
                try {

                    // Limpando a conexao, fechando a conexao
                    conexao.close();
                } catch (SQLException e2) {

                    // Tratando excecao lancando mensagem na tela (console)
                    throw new DAOException(e2.getMessage());
                }
        }
    }

   /**
     * Atualizara informacoes contidas na tabela login, que por ventura
     * ira executar tambem atualizacoes na tabela dados_aluno
     * @param alunoDTO
     * @throws DAOException
     */
    public void deleteDadosAluno(AlunoDTO alunoDTO) throws DAOException {
        // Captando uma conexao com a base de dados
        Connection conexao = dao.getConnection();

        // Passar valores em instrucoes SQL
        PreparedStatement ps = null;

        // Contera a instrucao SQL
        StringBuilder sql = new StringBuilder();
        try {
            // limpando o conteudo do objeto sql
            sql.delete(0, sql.length());

            // Montando a estrutura da instrucao
            sql.append("DELETE FROM dados_aluno ");
            sql.append("WHERE id_login = ? ");

            // Captando os valores passados pelo usuario no formulario
            ps = conexao.prepareStatement(sql.toString());
            ps.setInt(1, alunoDTO.getIdLogin());

            // Executando a instrucao e agendando sua persistencia
            ps.execute();

            // Excluido informacoes de dados_aluno
            deleteLogin(alunoDTO);

            // Persistindo a informacao na base
            // conexao.commit();
        } catch(Exception e1) {

            // Tratando excecao lancando mensagem na tela (console)
            e1.printStackTrace();
            throw new DAOException(e1.getMessage());
        } finally {
                try {

                    // Limpando a conexao, fechando a conexao
                    conexao.close();
                } catch (SQLException e2) {

                    // Tratando excecao lancando mensagem na tela (console)
                    throw new DAOException(e2.getMessage());
                }
        }
    }

    /**
     * Excluirá informacoes associadas a tabela dados_aluno
     */
    public void deleteLogin(AlunoDTO alunoDTO) throws DAOException {
        // Captando uma conexao com a base de dados
        Connection conexao = dao.getConnection();

        // Passar valores em instrucoes SQL
        PreparedStatement ps = null;

        // Contera a instrucao SQL
        StringBuilder sql = new StringBuilder();
        try {
            // limpando o conteudo do objeto sql
            sql.delete(0, sql.length());

            // Montando a estrutura da instrucao
            sql.append("DELETE FROM login ");
            sql.append("WHERE id_login = ? ");

            // Captando os valores passados pelo usuario no formulario
            ps = conexao.prepareStatement(sql.toString());
            ps.setInt(1, alunoDTO.getIdLogin());

            // Executando a instrucao e agendando sua persistencia
            ps.execute();

            // Persistindo a informacao na base
            // conexao.commit();
        } catch(Exception e1) {

            // Tratando excecao lancando mensagem na tela (console)
            e1.printStackTrace();
            throw new DAOException(e1.getMessage());
        } finally {
                try {

                    // Limpando a conexao, fechando a conexao
                    conexao.close();
                } catch (SQLException e2) {

                    // Tratando excecao lancando mensagem na tela (console)
                    throw new DAOException(e2.getMessage());
                }
        }
    }


    /**
     * Responsavel por inserir informacoes na secao de login da base de dados
     * @param alunoDTO
     * @author Fabricio Silva
     * @return
     */
    public Integer insertLogin (AlunoDTO alunoDTO) throws DAOException {
        // Captando uma conexao com a base de dados
        Connection conexao = dao.getConnection();

        int retorno = 0;

        // Passar valores em instrucoes SQL
        PreparedStatement ps = null;

        // Contera a instrucao SQL
        StringBuilder sql = new StringBuilder();
        try {
            // limpando o conteudo do objeto sql
            sql.delete(0, sql.length());

            // Montando a estrutura da instrucao
            sql.append("INSERT INTO login (usuario, senha, admin) ");
            sql.append("VALUES (?, ?, ?)");

            // Captando os valores passados pelo usuario no formulario
            ps = conexao.prepareStatement(sql.toString());
            ps.setString(1, alunoDTO.getNome());
            ps.setString(2, alunoDTO.getSenha());
            ps.setString(3, "N");

            // Executando a instrucao e agendando sua persistencia
            ps.execute();

            // Persistindo a informacao na base
            // conexao.commit();

            // Captando o id_login recem inserido
            retorno = getIdLogin();
        } catch(Exception e1) {

            // Tratando excecao lancando mensagem na tela (console)
            throw new DAOException(e1.getMessage());
        } finally {
                try {

                    // Limpando a conexao, fechando a conexao
                    conexao.close();
                } catch (SQLException e2) {

                    // Tratando excecao lancando mensagem na tela (console)
                    throw new DAOException(e2.getMessage());
                }
        }
        return retorno;
    }

    /**
     * Tratando de consultar a ultima informacao recem inserida na base de dados
     * associados a tabela login
     *
     * @author Fabricio Silva
     * @return
     * @throws DAOException
     */
    public Integer getIdLogin() throws DAOException {
        // Captando uma conexao com a base de dados
        Connection conexao = dao.getConnection();

        int retorno = 0;

        // Passar valores em instrucoes SQL
        PreparedStatement ps = null;

        // Tratando consultas na base
        ResultSet rs = null;

        // Contera a instrucao SQL
        StringBuilder sql = new StringBuilder();
        try {
            // limpando o conteudo do objeto sql
            sql.delete(0, sql.length());

            // Montando a estrutura da instrucao
            sql.append("SELECT MAX(id_login) AS id_login FROM login");

            // Realizando consultas na base
            ps = conexao.prepareStatement(sql.toString());
            rs = ps.executeQuery();

            while (rs.next()) {
                retorno = rs.getInt("id_login");
            }
        } catch(Exception e1) {

            // Tratando excecao lancando mensagem na tela (console)
            throw new DAOException(e1.getMessage());
        } finally {
            try {

                // Limpando a conexao, fechando a conexao
                conexao.close();
            } catch (SQLException e2) {

                // Tratando excecao lancando mensagem na tela (console)
                throw new DAOException(e2.getMessage());
            }
        }
        return retorno;
    }

    /**
     * Capaz de retornar a lista de alunos de acordo com o filtro
     * especificado pelo usuario
     * @param alunoDTO
     * @return
     */
    public Collection<AlunoDTO> listAlunos(AlunoDTO alunoDTO) throws DAOException {
        // Captando uma conexao com a base de dados
        Connection conexao = dao.getConnection();

        LinkedList retorno = null;

        // Passar valores em instrucoes SQL
        PreparedStatement ps = null;

        // Tratando consultas na base
        ResultSet rs = null;

        // Contera a instrucao SQL
        StringBuilder sql = new StringBuilder();
        try {
            // limpando o conteudo do objeto sql
            sql.delete(0, sql.length());

            // Montando a estrutura da instrucao
            sql.append("SELECT id_login, senha, usuario FROM login ");
            if (alunoDTO.getNome() != null) {
                sql.append("WHERE usuario ");
                sql.append("LIKE '%"+alunoDTO.getNome()+"%' ");
            }

            // Realizando consultas na base
            ps = conexao.prepareStatement(sql.toString());
            rs = ps.executeQuery();

            retorno = new LinkedList<AlunoDTO>();
            while (rs.next()) {
                AlunoDTO tmpDTO = new AlunoDTO();
                tmpDTO.setIdLogin(rs.getInt("id_login"));
                tmpDTO.setNome(rs.getString("usuario"));
                tmpDTO.setSenha(rs.getString("senha"));
                consultarDadosAluno(tmpDTO);
                retorno.add(tmpDTO);
            }
        } catch(Exception e1) {
            
            // Tratando excecao lancando mensagem na tela (console)
            throw new DAOException(e1.getMessage());
        } finally {
            try {

                // Limpando a conexao, fechando a conexao
                conexao.close();
            } catch (SQLException e2) {

                // Tratando excecao lancando mensagem na tela (console)
                throw new DAOException(e2.getMessage());
            }
        }
        return retorno;
    }

    /**
     * Consultando informacoes na tabela dados_aluno
     * @param alunoDTO
     * @throws DAOException
     */
    public void consultarDadosAluno(AlunoDTO alunoDTO) throws DAOException {
        // Captando uma conexao com a base de dados
        Connection conexao = dao.getConnection();

        // Passar valores em instrucoes SQL
        PreparedStatement ps = null;

        // Tratando consultas na base
        ResultSet rs = null;

        // Contera a instrucao SQL
        StringBuilder sql = new StringBuilder();
        try {
            // limpando o conteudo do objeto sql
            sql.delete(0, sql.length());

            // Montando a estrutura da instrucao
            sql.append("SELECT id_login, endereco, telefone, idade, sexo FROM dados_aluno ");
            sql.append("WHERE id_login = ? ");
            
            // Realizando consultas na base
            ps = conexao.prepareStatement(sql.toString());
            ps.setInt(1, alunoDTO.getIdLogin());
            rs = ps.executeQuery();

            while (rs.next()) {
                alunoDTO.setEndereco(rs.getString("endereco"));
                alunoDTO.setTelefone(rs.getString("telefone"));
                alunoDTO.setIdade(rs.getInt("idade"));
                alunoDTO.setSexo(rs.getString("sexo"));
            }
        } catch(Exception e1) {

            // Tratando excecao lancando mensagem na tela (console)
            throw new DAOException(e1.getMessage());
        } finally {
            try {

                // Limpando a conexao, fechando a conexao
                conexao.close();
            } catch (SQLException e2) {

                // Tratando excecao lancando mensagem na tela (console)
                throw new DAOException(e2.getMessage());
            }
        }
    }
}
